package com.jidong.test_springboot.web;

import javax.servlet.http.HttpServletRequest;

import org.apache.shiro.authc.AccountException;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.jidong.test_springboot.vo.ResultData;

/**ErrorController是springboot异常统一处理的最后一道坎，
 * 可以自动接收项目中(所有包不仅有controller还有service层 还有shiro层 dao层)所有的异常
 * 
 * 这种捕获异常的方式，适用于项目所有层次，所有异常捕获。
 * 网上教程基本都是在捕获Controller层的异常。但是
 * 因为我们shiro抛出的异常都在service层，也就是没有在controller层。
 * 所以用这种方式
 * */
@RestController
public class ExceptionContorller implements ErrorController {
 
    @Override
    public String getErrorPath() {
        return "/error";//这句话的意思是获取springboot默认的/error的地址，进行重写、
    }
 
    @RequestMapping("/error")
    public ResultData handleError(HttpServletRequest request) {
    	Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        Exception e = (Exception)request.getAttribute("javax.servlet.error.exception");
        if(e.getMessage().contains("AccountException")) {
        	return new ResultData().setCode(statusCode).setMsg("用户登录失败，请重新登录");
        }
        if(e.getMessage().contains("AuthenticationException")) {
        	return new ResultData().setCode(statusCode).setMsg("用户登录失败，请重新登录");
        }
        
        if(e.getMessage().contains("UnauthorizedException")) {
        	return new ResultData().setCode(statusCode).setMsg("权限不足，联系开发人员");
        }
        if(e.getMessage().contains("AuthorizationException")) {
        	return new ResultData().setCode(statusCode).setMsg("权限不足，联系开发人员");
        }
        return new ResultData().setCode(statusCode).setMsg(e.getMessage());
    }
 
 
}